package com.ask.utils;

import java.util.Map;

public class SimilarityUtils {

    public static double calculateCosineSimilarity(Map<Long, Double> item1Ratings, Map<Long, Double> item2Ratings) {
        double numerator = 0.0;
        double denominator1 = 0.0;
        double denominator2 = 0.0;

        // 遍历 item1Ratings 的用户评分
        for (Long userId : item1Ratings.keySet()) {
            // 如果用户也对 item2 评分，则计算分子部分
            if (item2Ratings.containsKey(userId)) {
                numerator += item1Ratings.get(userId) * item2Ratings.get(userId);
            }
        }

        // 计算分母的第一部分（item1 的评分平方和）
        for (Double score : item1Ratings.values()) {
            denominator1 += score * score;
        }

        // 计算分母的第二部分（item2 的评分平方和）
        for (Double score : item2Ratings.values()) {
            denominator2 += score * score;
        }

        // 如果分母为 0，则返回 0（避免除零错误）
        return denominator1 == 0 || denominator2 == 0 ? 0 : numerator / (Math.sqrt(denominator1) * Math.sqrt(denominator2));
    }
}
